#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>

int main() {
    // 打开模式
    // r  以只读的方式打开文件 (不创建文件, 若文件不存在就报错)
    // w  以只写的方式打开文件 (文件不存在就创建文件, 如果文件存在就清空文件内容)
    // b  以二进制的文本类型读或写文件
    // r+ 以可读、可写的方式打开文件 (不创建新文件)
    // w+ 以可读、可写的方式打开文件 (文件不存在就创建文件, 如果文件存在就清空文件内容)
    // a+ 以文本添加的方式打开文件 (打开文件并在末尾追加文件, 若文件不存在就创建文件)
    FILE *wfp_01 = fopen("./a.txt", "a+");

    char *buffer = malloc(sizeof(char) * 1024);
    memcpy(buffer, "Hello World!\n", sizeof(char) * strlen("Hello World!\n"));

    for (int i = 0; buffer[i] != '\0'; ++i) {
        // 往内存中读取数据到文件中
        fputc(buffer[i], wfp_01);
    }

    char ch;

    // 用 EOF 存在对二进制字符串的操作出错, EOF 不能很好的代表文件的读取结束
    FILE *rfp_01 = fopen("./a.txt", "r");
    while ((ch = fgetc(rfp_01)) != EOF) {
        printf("%c", ch);
    }
    printf("\n");

    // 用 feof 可以保证对二进制字符串的操作正确, feof 函数可以保证文件的读取结束
    FILE *rfp_02 = fopen("./a.txt", "r");
    while (true) {
        ch = fgetc(rfp_02);
        if (feof(rfp_02)) {
            break;
        }
        printf("%c", ch);
    }
    printf("\n");

    // 实现文件复制的功能 (复制二进制类型的文件时读写需要添加 b)
    FILE *wfp_02 = fopen("./a.cp.txt", "w+");
    FILE *rfp_03 = fopen("./a.txt", "r");

    while (true) {
        ch = fgetc(rfp_03);
        if (feof(rfp_03)) {
            break;
        }
        fputc(ch, wfp_02);
    }

    fclose(wfp_01);
    fclose(wfp_02);
    fclose(rfp_01);
    fclose(rfp_02);
    fclose(rfp_03);

    return 0;
}